/**
 * 车型参数映射表
 * 将INI文件中的参数名映射到Modbus寄存器地址
 * 
 * 地址计算公式：ModbusAddress = (index - 2) * 2
 * index 是Excel表中的行号
 * 
 * 注意：车型配置文件包含 车型号(1个) + 电机参数(12个) = 13个参数
 */

const VEHICLE_PARAM_MAP = {
  // 车型专属参数
  'PVehicleModel':    { index: 105, datatype: 1, name: '车型号' },          // 整数，标识不同车型
  
  // 以下参数与电机配置文件相同
  'PMotDir':          { index: 2,   datatype: 1, name: '电机方向' },        // 0=反向, 1=正向
  'PMotorPoles':      { index: 13,  datatype: 1, name: '电机极对数' },      // 极对数
  
  // 电流环PID参数
  'PUser_Ikp':        { index: 17,  datatype: 3, name: '电流环Kp' },        // IQ16格式
  'PUser_Iki':        { index: 18,  datatype: 3, name: '电流环Ki' },        // IQ16格式
  
  // 速度环PID参数
  'PSpeedKp':         { index: 19,  datatype: 3, name: '速度环Kp' },        // IQ16格式
  'PSpeedKi':         { index: 20,  datatype: 3, name: '速度环Ki' },        // IQ16格式
  
  // 车速系数
  'PVechSpdK':        { index: 15,  datatype: 1, name: '车速系数' },        // 整数
  
  // 高速参数
  'PuserH_Ikp':       { index: 21,  datatype: 3, name: '高速电流环Kp' },    // IQ16格式
  'PuserH_Iki':       { index: 22,  datatype: 3, name: '高速电流环Ki' },    // IQ16格式
  'PuserH_Speed':     { index: 23,  datatype: 1, name: '高速切换转速' },    // 整数, RPM
  
  // 弱磁PID参数
  'PUser_WeakIkp':    { index: 24,  datatype: 3, name: '弱磁Kp' },          // IQ16格式
  'PUser_WeakIki':    { index: 25,  datatype: 3, name: '弱磁Ki' },          // IQ16格式
};

/**
 * 数据类型说明
 * 0: 百分比（0-100）
 * 1: 整数
 * 2: AD转换值
 * 3: IQ16定点数（需要 * 65536）
 */

/**
 * 将INI参数值转换为Modbus写入值
 * @param {string} paramName - 参数名
 * @param {string} rawValue - 原始值（字符串）
 * @returns {number} - 转换后的值
 */
function convertValue(paramName, rawValue) {
  const config = VEHICLE_PARAM_MAP[paramName];
  if (!config) {
    throw new Error(`未知参数: ${paramName}`);
  }

  const numValue = parseFloat(rawValue);
  
  switch (config.datatype) {
    case 0: // 百分比
      return Math.round(numValue);
    
    case 1: // 整数
      return Math.round(numValue);
    
    case 2: // AD转换
      return Math.round(numValue);
    
    case 3: // IQ16定点数
      return Math.round(numValue * 65536);
    
    default:
      return Math.round(numValue);
  }
}

/**
 * 获取参数配置
 * @param {string} paramName - 参数名
 * @returns {object|null} - 参数配置
 */
function getParamConfig(paramName) {
  return VEHICLE_PARAM_MAP[paramName] || null;
}

/**
 * 获取所有支持的参数名
 * @returns {array} - 参数名数组
 */
function getSupportedParams() {
  return Object.keys(VEHICLE_PARAM_MAP);
}

/**
 * 检查参数是否支持
 * @param {string} paramName - 参数名
 * @returns {boolean}
 */
function isParamSupported(paramName) {
  return paramName in VEHICLE_PARAM_MAP;
}

module.exports = {
  VEHICLE_PARAM_MAP,
  convertValue,
  getParamConfig,
  getSupportedParams,
  isParamSupported
};

